package br.com.sms.util;

import javax.persistence.Query;

import br.com.sms.dominio.Cidade;
import br.com.sms.dominio.Destinatario;
import br.com.sms.dto.DestinatarioDTO;
import br.com.sms.enuns.UF;

public class UtilSQL {

	/**
	 * Monta o SQL para consulta de acordo com os campos preenchidos no objeto DTO
	 * @param dto
	 * @return
	 */
	public static String montarSql(DestinatarioDTO dto){
		StringBuilder sql = new StringBuilder();
		boolean possuiWhere = false;
		
		Destinatario dest = dto.getDestinatario();
		
		sql.append("select d from Destinatario d ");
		if(dest.getCidade() != null && 
				dest.getCidade().getId() > 0 || 
				Util.isPreenchido(dto.getCidade())){
			sql.append("where d.cidade.id = :cidade ");
			possuiWhere = true;
		}
		
		if(dto.getUf() != null){
			if(possuiWhere){
				sql.append("and d.cidade.uf = :uf ");
			}
			
			else{
				sql.append("where d.cidade.uf = :uf ");
				possuiWhere = true;
			}
		}
		
		if(Util.isPreenchido(dest.getNome())){
			if(possuiWhere)
				sql.append("and d.nome like :nome ");
			
			else
				sql.append("where d.nome like :nome ");
		}
		
		if(Util.isPreenchido(dest.getEmail())){
			if(possuiWhere)
				sql.append("and d.email like :email ");
			
			else
				sql.append("where d.email like :email ");
		}
		
		if(Util.isPreenchido(dest.getCep())){
			if(possuiWhere)
				sql.append("and d.cep like :cep ");
			else
				sql.append("where d.cep like :cep ");
		}
		
		if(Util.isPreenchido(dest.getCpf())){
			if(possuiWhere)
				sql.append("and d.cpf like :cpf ");
			else
				sql.append("where d.cpf like :cpf ");
		}
		
		//CONSULTAS DO DTO
		if(Util.isPreenchido(dto.getTelefone())){
			
		}
		
		if(Util.isPreenchido(dto.getCelular())){
			
		}
		
		
		return sql.toString();
	}
	
	
	/**
	 * Monta o SQL para consulta de acordo com os campos preenchidos no objeto DTO
	 * @param cidade
	 * @param nome
	 * @return
	 */
	public static String montarSql(Cidade cidade, String nome){
		StringBuilder sql = new StringBuilder();
		boolean possuiWhere = false;
		
		sql.append("select d from Destinatario d ");
		if(cidade != null && cidade.getId() > 0){ 
						sql.append("where d.cidade.id = :cidade ");
			possuiWhere = true;
		}
		
		if(nome != null && nome.trim().length() > 0){
			if(possuiWhere){
				sql.append("and d.nome like :nome ");
			}
			else{
				sql.append("where d.nome like :nome ");
			}
		}
		return sql.toString();
	}
	
	/**
	 * Monta o SQL para consulta de acordo com os campos preenchidos no objeto DTO
	 * @param uf
	 * @param cidade
	 * @param cep
	 * @return
	 */
	public static String montarSql(UF uf, Cidade cidade, String cep){
		StringBuilder sql = new StringBuilder();
		boolean possuiWhere = false;
		
		sql.append("select d from Destinatario d ");
		if(uf != null){
			sql.append("where d.cidade.uf = :uf ");
			possuiWhere = true;
		}
		
		if(cidade != null && cidade.getId() > 0){
			if(possuiWhere)
				sql.append("and d.cidade.id = :cidade ");
			else{
				sql.append("where d.cidade.id = :cidade ");
				possuiWhere = true;
			}
		}
		
		if(cep != null && cep.trim().length() > 0){
			if(possuiWhere){
				sql.append("and d.cep = :cep ");
			}
			else{
				sql.append("where d.cep = :cep ");
			}
		}
		return sql.toString();
	}
	
	/**
	 * Preenche as condiçoes com os parametros
	 * @param query
	 * @param cidade
	 * @param nome
	 */
	public static void preencherClausula(Query query, Cidade cidade, String nome){
	
		if(cidade != null && cidade.getId() > 0){ 
			query.setParameter("cidade", cidade.getId());
		}
		
		if(nome != null && nome.trim().length() > 0){
			query.setParameter("nome", "%"+nome.toUpperCase()+"%");
		}
	}	
	
	
	/**
	 * Preenche as condiçoes com os parametros
	 * @param query
	 * @param uf
	 * @param cidade
	 * @param cep
	 */
	public static void preencherClausula(Query query, UF uf, Cidade cidade, String cep){
		
		if(uf != null){
			query.setParameter("uf", uf);
		}
		
		if(cidade != null && cidade.getId() > 0){ 
			query.setParameter("cidade", cidade.getId());
		}
		
		if(cep != null && cep.trim().length() > 0){
			query.setParameter("cep", cep);
		}
	}
	
	
	/**
	 * Preenche as condiçoes com os parametros
	 * @param query
	 * @param destinatarioDTO
	 */
	public static void preencherClausula(Query query, DestinatarioDTO dto){
		Destinatario dest = dto.getDestinatario();
		
		if(dest.getCidade() != null && dest.getCidade().getId() > 0){
			query.setParameter("cidade", dest.getCidade().getId());
		}
		
		if(dto.getUf() != null){
			query.setParameter("uf", dto.getUf());
		}
		
		if(Util.isPreenchido(dest.getNome())){
			query.setParameter("nome", "%"+dest.getNome()+"%");
		}
		
		if(Util.isPreenchido(dest.getEmail())){
			query.setParameter("email", "%"+dest.getEmail()+"%");
		}
		
		if(Util.isPreenchido(dest.getCep())){
			query.setParameter("cep", "%"+dest.getCep()+"%");
		}
		
		if(Util.isPreenchido(dest.getCpf())){
			query.setParameter("cpf", "%"+dest.getCpf()+"%");
		}
	}
	
}
